#include<iostream>
#include<signal.h>
#include<unistd.h>
#include <sys/types.h>
#include <unistd.h>
using namespace std;

//sigprocmask信号屏蔽
void handler(int signo)
{
    cout<<"当前收到"<<signo<<"号信号"<<endl;
}
// int main()
// {
//     cout<<"mypid = "<<getpid()<<endl;
//     sigset_t set,oset;//创建临时位图block表
//     signal(2,handler);//自定义二号信号的方法

//     //清空临时信号集
//     sigemptyset(&set);
//     sigemptyset(&oset);

//     //设置信号集到临时变量
//     sigaddset(&set,2);

//     sigprocmask(SIG_SETMASK,&set,&oset);//将信号集设置到该进程中

//     while(1)
//     {}

//     return 0;
// }

//sigpending获取未决信号集

void print(const sigset_t& tmp)
{
    for(int i=1;i<=32;i++)
    {
        if(sigismember(&tmp,i))
            cout<<1;
        else
            cout<<0;
    }
    cout<<endl;
}
int main()
{
    signal(2,handler);//自定义

    //屏蔽2号信号
    cout<<"mypid = "<<getpid()<<endl;
    sigset_t set,tmp,oset;
    sigemptyset(&set);
    sigemptyset(&tmp);
    sigemptyset(&oset);
    sigaddset(&set,2);
    sigprocmask(SIG_BLOCK,&set,&oset);//将信号集添加到该进程中

    int count=0;
    while(1)
    {
        sigpending(&tmp);
        print(tmp);
        //取消屏蔽，信号处理
        if(count==3)
        {
            cout<<"解除2号信号的屏蔽状态"<<endl;
            sigprocmask(SIG_UNBLOCK,&set,&oset);//解除屏蔽后，进程立马就递达了
        }
        sleep(1);
        count++;
    }

    return 0;
}